package org.csu.laboratoryequipment.model;

import com.huaban.analysis.jieba.JiebaSegmenter;
import org.apache.commons.io.FileUtils;
import org.apdplat.word.WordSegmenter;
import org.apdplat.word.segmentation.SegmentationAlgorithm;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;

//载入各种分词结果
public class WordSegment {

    //对数据进行结巴分词,然后去除停用词得到结果
    public void segment_jieba(String transferFile ) throws IOException {
        long start = System.currentTimeMillis();
        //载入停用词文件
        List<String> stopwords = FileUtils.readLines(new File(FilePath.STOP_WORD_FILE_NAME), StandardCharsets.UTF_8);
        //载入简单清洗之后的数据文件
        List<String> transferLines = FileUtils.readLines(new File(transferFile),StandardCharsets.UTF_8);
        JiebaSegmenter jiebaSegmenter = new JiebaSegmenter();
        //载入jieba分词结果
        OutputStreamWriter outStream = new OutputStreamWriter(new FileOutputStream(new File(FilePath.JIEBA_DIVIDE_WORD_FILE_NAME)), "UTF-8");
        BufferedWriter bw = new BufferedWriter(outStream);
        for (String s :transferLines)
        {
            //进行jieba分词，同时去除停用词
            List<String> linedivide = jiebaSegmenter.sentenceProcess(s);
            linedivide.removeAll(stopwords);
            //确保去除结果不为空
            if(!(linedivide.isEmpty()))
            {
                //写入jieba分词结果文件当中
                for (String string:linedivide)
                {
                    bw.append(string);
                    bw.append('\t');
                }
                bw.newLine();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("结巴分词算法所用的时间是："+(end-start)+"ms");
    }


    //正向最大匹配算法
    public void segment_MaximumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.MaximumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output), SegmentationAlgorithm.MaximumMatching);
        long end = System.currentTimeMillis();
        System.out.println("正向最大匹配分词算法所用的时间是："+(end-start)+"ms");
    }


    //逆向最大匹配算法
    public void segment_ReverseMaximumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.ReverseMaximumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.ReverseMaximumMatching);
        long end = System.currentTimeMillis();
        System.out.println("逆向最大匹配分词算法所用的时间是："+(end-start)+"ms");
    }

    //正向最小匹配算法
    public void segment_MinimumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.MinimumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.MinimumMatching);
        long end = System.currentTimeMillis();
        System.out.println("正向最小匹配算法所用的时间是："+(end-start)+"ms");
    }

    //逆向最小匹配算法
    public void segment_ReverseMinimumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.ReverseMinimumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.ReverseMinimumMatching);
        long end = System.currentTimeMillis();
        System.out.println("逆向最小匹配算法所用的时间是："+(end-start)+"ms");
    }

    //双向最大匹配算法
    public void segment_BidirectionalMaximumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.BidirectionalMaximumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.BidirectionalMaximumMatching);
        long end = System.currentTimeMillis();
        System.out.println("双向最大匹配算法所用的时间是："+(end-start)+"ms");
    }

    //双向最小匹配算法
    public void segment_BidirectionalMinimumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.BidirectionalMinimumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.BidirectionalMinimumMatching);
        long end = System.currentTimeMillis();
        System.out.println("双向最小匹配算法所用的时间是："+(end-start)+"ms");
    }

    //双向最大最小匹配算法
    public void segment_BidirectionalMaximumMinimumMatching(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.BidirectionalMaximumMinimumMatching_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.BidirectionalMaximumMinimumMatching);
        long end = System.currentTimeMillis();
        System.out.println("双向最大最小匹配算法所用的时间是："+(end-start)+"ms");
    }

    //全切分算法
    public void segment_FullSegmentation(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.FullSegmentation_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.FullSegmentation);
        long end = System.currentTimeMillis();
        System.out.println("全切分算法所用的时间是："+(end-start)+"ms");
    }

    //最少词数算法
    public void segment_MinimalWordCount(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.MinimalWordCount_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.MinimalWordCount);
        long end = System.currentTimeMillis();
        System.out.println("最少词数算法所用的时间是："+(end-start)+"ms");
    }

    //最大Ngram分值算法
    public void segment_MaxNgramScore(String transferFile) throws Exception {
        long start = System.currentTimeMillis();
        //对文件进行分词
        String input = FilePath.TRANSFER_FILE_NAME;
        String output = FilePath.MaxNgramScore_DIVIDE_WORD_FILE_NAME;
        //移除停用词并同时对该文件进行分词
        WordSegmenter.seg(new File(input), new File(output),SegmentationAlgorithm.MaxNgramScore);
        long end = System.currentTimeMillis();
        System.out.println("最大Ngram分值算法所用的时间是："+(end-start)+"ms");
    }

    public void segment_result(String transferFile) throws Exception {
        long start1 = System.currentTimeMillis();
        segment_jieba(FilePath.TRANSFER_FILE_NAME); //jieba分词
        long start2 = System.currentTimeMillis();

//        segment_MaximumMatching(FilePath.TRANSFER_FILE_NAME);//正向最大匹配算法
//        long start3 = System.currentTimeMillis();
//        segment_ReverseMaximumMatching(FilePath.TRANSFER_FILE_NAME);//逆向最大匹配算法
//
//        long start4 = System.currentTimeMillis();
//        segment_MinimumMatching(FilePath.TRANSFER_FILE_NAME);//正向最小匹配算法
//
//        long start5 = System.currentTimeMillis();
//        segment_ReverseMinimumMatching(FilePath.TRANSFER_FILE_NAME);//逆向最小匹配算法
//
//        long start6 = System.currentTimeMillis();
//        segment_BidirectionalMaximumMatching(FilePath.TRANSFER_FILE_NAME);//双向最大匹配算法
//
//        long start7= System.currentTimeMillis();
//        segment_BidirectionalMinimumMatching(FilePath.TRANSFER_FILE_NAME);//双向最小匹配算法
//
//        long start8 = System.currentTimeMillis();
//        segment_BidirectionalMaximumMinimumMatching(FilePath.TRANSFER_FILE_NAME);//双向最大最小匹配算法
//
//        long start9= System.currentTimeMillis();
//        segment_FullSegmentation(FilePath.TRANSFER_FILE_NAME);//全切分算法
//
//        long start10 = System.currentTimeMillis();
//        segment_MinimalWordCount(FilePath.TRANSFER_FILE_NAME);//最少词数算法
//
//        long start11 = System.currentTimeMillis();
//        segment_MaxNgramScore(FilePath.TRANSFER_FILE_NAME);//最大Ngram分值算法
//
        System.out.println("jieba分词所用的时间是:"+(start2-start1)+"ms");
//        System.out.println("正向最大匹配算法所用的时间是:"+(start3-start2)+"ms");
//        System.out.println("逆向最大匹配算法所用的时间是:"+(start4-start3)+"ms");
//        System.out.println("正向最小匹配算法所用的时间是:"+(start5-start4)+"ms");
//        System.out.println("逆向最小匹配算法所用的时间是:"+(start6-start5)+"ms");
//        System.out.println("双向最大匹配算法所用的时间是:"+(start7-start6)+"ms");
//        System.out.println("双向最小匹配算法所用的时间是:"+(start8-start7)+"ms");
//        System.out.println("双向最大最小匹配算法所用的时间是:"+(start9-start8)+"ms");
//        System.out.println("全切分算法所用的时间是:"+(start10-start9)+"ms");
//        System.out.println("最少词数算法所用的时间是:"+(start11-start10)+"ms");
    }
}
